PX4 SITL
使用Gazebo仿真模拟器
首先,我们将使用控制台环境构建一个模拟目标。这使我们能够在进入真实硬件和 IDE 之前验证系统设置。
进入到 PX4-Autopilot 目录并使用以下命令 启动 Gazebo SITL :
make px4_sitl gz_x500
如果您安装了 Gazebo Classic 使用以下命令启动Gazebo Classic SITL :
make px4_sitl gazebo-classic
这将打开 PX4 控制台:

您可能需要先启动 QGroundControl 才能继续操作,因为默认的 PX4 配置要求在起飞前建立地面控制连接。您可以 从此处下载 。
输入以下命令即可让无人机飞行(如上图控制台所示):
pxh> commander takeoff
飞行器将会起飞,您将在 Gazebo 模拟器 UI 中看到以下内容:

可以通过输入让无人机降落,并且可以通过按 CTRL+C (或输入 shutdown) commander land 来停止整个模拟。
使用地面控制站进行模拟飞行更接近飞行器的实际操作。在飞行器飞行(起飞飞行模式)时,点击地图上的某个位置并启用滑块。这将重新定位飞行器。

SITL重要概念解释
在 PX4 使用 Gazebo 进行软件在环仿真(SITL, Software-In-The-Loop)的流程中,GZ_VERSION、px4_gz_bridge、ros_gz_bridge和SDF是四个核心概念,分别对应版本管理、跨模块通信和仿真模型定义,以下是详细解析:
一、PX4 Gazebo Version:GZ_VERSION
GZ_VERSION 是 PX4 构建系统中用于指定 Gazebo 版本的环境变量,核心作用是解决 “PX4 与 Gazebo 版本兼容性” 问题 —— 不同 PX4 版本对 Gazebo 的支持范围不同,需通过该变量明确编译目标版本,避免编译失败或功能异常。
1. 核心背景:Gazebo 的版本演进与 PX4 支持
Gazebo(现归属于 Open Robotics)经历了多个重要版本迭代,PX4 对其支持具有明确的 “版本绑定” 特性,主要分为两大系列:
- 传统 Gazebo(Gazebo Classic):如 Gazebo 9、11(PX4 v1.13 及之前版本的主流支持版本);
- Gazebo Fortress/Edifice(新一代 Gazebo):从 PX4 v1.14 开始逐步迁移,现成为主流(命名从 “Gazebo X” 改为 “GZ-XXX”,如 GZ-Fortress 对应版本号 12)。
2. GZ_VERSION 的取值与使用场景
GZ_VERSION 取值 | 对应 Gazebo 版本 | PX4 支持版本范围 | 核心用途 |
|---|---|---|---|
9/11 | Gazebo Classic 9/11 | PX4 v1.13 及更早 | 传统 SITL 仿真(如多旋翼、固定翼基础场景) |
fortress | GZ-Fortress(v12) | PX4 v1.14 ~ v1.15 | 新一代仿真,支持更复杂物理效果 |
edifice | GZ-Edifice(v11) | PX4 v1.14+(可选) | 过渡版本,部分场景兼容 |
harmonic | GZ-Harmonic(v13) | PX4 v1.16+(最新主流) | 最新版本,优化性能与多机器人支持 |
3. 如何设置 GZ_VERSION
在编译 PX4 SITL 时,通过终端环境变量指定版本,示例如下:
# 1. 临时设置(当前终端生效):指定使用GZ-Fortress
export GZ_VERSION=fortress
# 2. 编译PX4 SITL(以多旋翼为例)
make px4_sitl gz_x500
二、px4_gz_bridge:PX4 与 Gazebo 的核心通信桥
px4_gz_bridge 是 PX4 官方开发的专用通信接口库,用于实现 PX4 飞控(SITL 模式)与 Gazebo 仿真器之间的 “数据双向传输”,是 SITL 仿真的 “数据中枢”。
1. 核心功能:数据交互的 “翻译官”
PX4(飞控逻辑)和 Gazebo(物理仿真)基于不同的消息协议,px4_gz_bridge 的核心作用是协议转换与数据路由,主要交互的数据类型包括:
| 数据方向 | 关键数据类型 | 用途说明 |
|---|---|---|
| PX4 → Gazebo(控制指令) | 电机转速指令(Motor Command)、姿态控制指令 | PX4 向 Gazebo 发送 “控制信号”,驱动仿真无人机运动 |
| Gazebo → PX4(传感器数据) | IMU(惯性测量单元)、GPS、气压计、视觉里程计 | Gazebo 向 PX4 反馈 “仿真环境中的传感器数据”,供飞控解算位置 / 姿态 |
2. 技术特点:轻量、原生集成
- 无额外依赖:直接集成在 PX4 源码的
src/modules/px4_gz_bridge/目录下,随 PX4 编译自动构建,无需单独安装; - 版本绑定:
px4_gz_bridge的代码会随GZ_VERSION适配,确保与指定的 Gazebo 版本兼容(如针对 GZ-Fortress 的消息格式优化); - 可扩展:支持自定义消息类型(如添加特定传感器数据),只需在桥接代码中添加对应的协议转换逻辑。
三、ros_gz_bridge:ROS 与 Gazebo 的通信桥(间接支持 PX4)
ros_gz_bridge 是 ROS(机器人操作系统)与 Gazebo 之间的通用通信桥,并非 PX4 专属,但在 “PX4+ROS+Gazebo” 的复合场景中(如需要 ROS 节点处理感知、规划算法时),是关键的中间件。
1. 与 px4_gz_bridge 的核心区别
很多初学者会混淆两者,需明确其定位差异:
| 对比维度 | px4_gz_bridge | ros_gz_bridge |
|---|---|---|
| 通信双方 | PX4 飞控 ↔ Gazebo | ROS 节点 ↔ Gazebo |
| 协议基础 | PX4 自定义 UORB 消息 ↔ Gazebo 消息 | ROS 消息(如sensor_msgs/Imu) ↔ Gazebo 消息 |
| 归属与依赖 | PX4 源码内置,无 ROS 依赖 | Open Robotics 维护,需依赖 ROS 2(如 Humble) |
| PX4 场景用途 | 基础 SITL 必用(无 ROS 时也需启动) | 需 ROS 功能时使用(如 RViz 可视化、ROS 规划节点) |
2. PX4 场景中的典型用法
当需要用 ROS 处理数据(如用 ROS 2 节点做目标检测、路径规划)时,ros_gz_bridge 需与 px4_gz_bridge 配合工作,数据流向示例:
Gazebo(仿真传感器)→ ros_gz_bridge → ROS 2节点(处理数据)→ ROS 2→PX4(如通过MAVLink)→ PX4飞控
示例启动命令(ROS 2 Humble + GZ-Fortress):
# 启动ROS-Gazebo桥,转发IMU和GPS数据到ROS话题
ros2 run ros_gz_bridge parameter_bridge /imu@sensor_msgs/msg/Imu[gz.msgs.IMU
ros2 run ros_gz_bridge parameter_bridge /gps@sensor_msgs/msg/NavSatFix[gz.msgs.NavSatFix
四、SDF:仿真模型的 “蓝图” 文件
SDF(Simulation Description Format,仿真描述格式)是 Gazebo 用于定义仿真环境和模型的标准 XML 格式文件,在 PX4 SITL 中,无人机的外观、物理属性、传感器配置均通过 SDF 文件定义。
1. 核心作用:定义 “仿真世界”
PX4 SITL 启动时,Gazebo 会加载对应 的 SDF 文件,该文件包含两类关键信息:
- 无人机模型(Model):如多旋翼的机架尺寸、电机位置、传感器(IMU/GPS)的安装位姿、物理参数(质量、转动惯量);
- 仿真场景(World):如地面、天空、风力、光照等环境参数(部分场景还包含障碍物、其他无人机)。
2. PX4 中 SDF 文件的位置与示例
PX4 源码中已预置常用无人机的 SDF 文件,路径为:
PX4-Autopilot/Tools/simulation/gz/models/
# 示例:X500多旋翼模型
PX4-Autopilot/Tools/simulation/gz/models/x500/x500.sdf
SDF 文件片段(定义 IMU 传感器):
<sensor name="imu" type="imu">
<pose>0 0 0.05 0 0 0</pose> <!-- IMU在机架上的安装位姿(x,y,z,滚转,俯仰,偏航) -->
<topic>/imu</topic> <!-- 传感器数据发布到Gazebo的话题 -->
<imu>
<angular_velocity>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>0.001 0.001 0.001</stddev> <!-- 角速度噪声参数 -->
</noise>
</angular_velocity>
<!-- 加速度计、陀螺仪等参数省略 -->
</imu>
</sensor>
3. 关键特性:可定制与复用
- 参数修改:可直接编辑 SDF 文件调整仿真参数(如增加传感器噪声、修改机架质量),无需修改 PX4 核心代码;
- 模型复用:支持导入第三方 SDF 模型(如自定义无人机、场景),只需将模型文件放入 Gazebo 的模型搜索路径(或在 PX4 启动脚本中指定路径)。
总结:四者的协同关系
在 PX4 Gazebo SITL 流程中,四个概念的协同逻辑可概括为:
- 通过
GZ_VERSION指定目标 Gazebo 版本,确保编译兼容性; - Gazebo 加载 SDF 文件,构建包含无人机和环境的仿真世界;
px4_gz_bridge启动,实现 PX4 飞控与 Gazebo 的核心数据交互(控制指令 + 传感器数据);- 若需 ROS 功能,
ros_gz_bridge启动,将 Gazebo 数据转发到 ROS 话题(或接收 ROS 指令),形成 “PX4-ROS-Gazebo” 闭环。
理解这四者的作用,是排查 PX4 SITL 编译错误、定制仿真场景的基础(如解决 “传感器数据无反馈”“Gazebo 启动失败” 等常见问题)。
常见问题
1. make px4_sitl gz_x500出现Preflight Fail 预飞检查失败,传感器数据丢失
解决方法1:卸载重装gz版本,比如gzgarden gzharmonic等这些版本 https://github.com/PX4/PX4-Autopilot/issues/24033 https://discuss.px4.io/t/px4-simulation-in-gazebo-fortress-support/45249
解决方法2:由于在v1.15版本将Tools的gz替换为v1.16版本的gz文件内容,替换回原版本对应的没有问题
解决方法3:使用其他模拟机身及环境模型,比如 make px4_sitl gz_x500
解决方 法4:检查sdf文件是否包含传感器插件,如果没有添加试试 Missing sensors for a Gazebo simulation
2. ros_gz_bridge 无法工作,无法使用 rviz2 获取 PX4 x500_mono_cam 图像主题
3. 时间戳同步对齐问题
https://blog.csdn.net/2401_83038233/article/details/149101727
ERROR [vehicle_imu] 0 - gyro 1310988 timestamp error timestamp_sample: 1110864000, previous timestamp_sampl
ERROR [vehicle_imu] 0 - accel 1310988 timestamp error timestamp_sample: 1110864000, previous timestamp_samp
NodeShared::Publish()
Error: Interrupted system call